{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# spacy库的使用\n",
    "参考：[如何用Python处理自然语言](http://blog.sciencenet.cn/blog-377709-1113703.html)\n",
    "\n",
    "根据[官网](https://spacy.io/usage/)进行安装"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import spacy     # 导入函数库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = \"The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.\n"
     ]
    }
   ],
   "source": [
    "print(text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 分析文本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013."
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nlp = spacy.load('en')                       # 加载英语模型\n",
    "doc = nlp(text)\n",
    "doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"The\"\n",
      "\"sequel\"\n",
      "\",\"\n",
      "\"Yes\"\n",
      "\",\"\n",
      "\"Prime\"\n",
      "\"Minister\"\n",
      "\",\"\n",
      "\"ran\"\n",
      "\"from\"\n"
     ]
    }
   ],
   "source": [
    "for token in doc[:10]:\n",
    "    print('\"{}\"'.format(token.text))         # 输出序列的每个词(token，包括符号)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 显示文本的各属性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The       0    the       False\tFalse\tXxx    DET    DT   \n",
      "sequel    4    sequel    False\tFalse\txxxx   NOUN   NN   \n",
      ",         10   ,         True\tFalse\t,      PUNCT  ,    \n",
      "Yes       12   yes       False\tFalse\tXxx    INTJ   UH   \n",
      ",         15   ,         True\tFalse\t,      PUNCT  ,    \n",
      "Prime     17   prime     False\tFalse\tXxxxx  PROPN  NNP  \n",
      "Minister  23   minister  False\tFalse\tXxxxx  PROPN  NNP  \n",
      ",         31   ,         True\tFalse\t,      PUNCT  ,    \n",
      "ran       33   run       False\tFalse\txxx    VERB   VBD  \n",
      "from      37   from      False\tFalse\txxxx   ADP    IN   \n"
     ]
    }
   ],
   "source": [
    "for token in doc[:10]:\n",
    "    print('{0:<10}{1:<5}{2:<10}{3}\\t{4}\\t{5:<7}{6:<7}{7:<5}'.format(\n",
    "        token.text,                 # 文本\n",
    "        token.idx,                  # 索引值，按照字母序号，在原文中的定位(包括空格)\n",
    "        token.lemma_,               # 词元\n",
    "        token.is_punct,             # 是否为标点 punctuation\n",
    "        token.is_space,             # 是否是空格\n",
    "        token.shape_,               # 形状，主要针对大小写\n",
    "        token.pos_,                 # 词性\n",
    "        token.tag_                  # 标记\n",
    "    ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 输出实体词汇"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1986 to 1988        DATE      \n",
      "38                  CARDINAL  \n",
      "one                 CARDINAL  \n",
      "half an hour        TIME      \n",
      "Jim Hacker          PERSON    \n",
      "BBC Radio           ORG       \n",
      "2010                DATE      \n",
      "UKTV Gold           ORG       \n",
      "2013                DATE      \n"
     ]
    }
   ],
   "source": [
    "# cardinal:基数    org：机构\n",
    "for ent in doc.ents:\n",
    "    print('{:<20}{:<10}'.format(ent.text, ent.label_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"entities\" style=\"line-height: 2.5\">The sequel, Yes, Prime Minister, ran from \n",
       "<mark class=\"entity\" style=\"background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    1986 to 1988\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">DATE</span>\n",
       "</mark>\n",
       ". In total there were \n",
       "<mark class=\"entity\" style=\"background: #e4e7d2; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    38\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">CARDINAL</span>\n",
       "</mark>\n",
       " episodes, of which all but \n",
       "<mark class=\"entity\" style=\"background: #e4e7d2; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    one\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">CARDINAL</span>\n",
       "</mark>\n",
       " lasted \n",
       "<mark class=\"entity\" style=\"background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    half an hour\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">TIME</span>\n",
       "</mark>\n",
       ". Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, \n",
       "<mark class=\"entity\" style=\"background: #aa9cfc; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    Jim Hacker\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">PERSON</span>\n",
       "</mark>\n",
       ". Several episodes were adapted for \n",
       "<mark class=\"entity\" style=\"background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    BBC Radio\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">ORG</span>\n",
       "</mark>\n",
       ", and a stage play was produced in \n",
       "<mark class=\"entity\" style=\"background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    2010\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">DATE</span>\n",
       "</mark>\n",
       ", the latter leading to a new television series on \n",
       "<mark class=\"entity\" style=\"background: #7aecec; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    UKTV Gold\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">ORG</span>\n",
       "</mark>\n",
       " in \n",
       "<mark class=\"entity\" style=\"background: #bfe1d9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em; box-decoration-break: clone; -webkit-box-decoration-break: clone\">\n",
       "    2013\n",
       "    <span style=\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\">DATE</span>\n",
       "</mark>\n",
       ".</div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示实体词汇\n",
    "from spacy import displacy\n",
    "displacy.render(doc, style='ent', jupyter=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. 将段落拆解为语句"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The sequel, Yes, Prime Minister, ran from 1986 to 1988.\n",
      "\n",
      "In total there were 38 episodes, of which all but one lasted half an hour.\n",
      "\n",
      "Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker.\n",
      "\n",
      "Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for sentence in doc.sents: \n",
    "    print(sentence)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<generator object at 0x00000174826B1488>\n",
      "\n",
      "[The sequel, Yes, Prime Minister, ran from 1986 to 1988., In total there were 38 episodes, of which all but one lasted half an hour., Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker., Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.]\n"
     ]
    }
   ],
   "source": [
    "print(doc.sents)             # 注意doc.sents是生成器\n",
    "print()\n",
    "print(list(doc.sents))       # 先转换为list再进行操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. 处理单独的句子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "The sequel, Yes, Prime Minister, ran from 1986 to 1988."
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "newdoc = nlp(list(doc.sents)[0].text)          # 将首句提出来进行分析\n",
    "newdoc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.1 分析词例的依赖关系"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(The       DT   )  <--det     --  (sequel    NN   )\n",
      "(sequel    NN   )  <--nsubj   --  (ran       VBD  )\n",
      "(,         ,    )  <--punct   --  (sequel    NN   )\n",
      "(Yes       UH   )  <--intj    --  (sequel    NN   )\n",
      "(,         ,    )  <--punct   --  (sequel    NN   )\n",
      "(Prime     NNP  )  <--compound--  (Minister  NNP  )\n",
      "(Minister  NNP  )  <--appos   --  (sequel    NN   )\n",
      "(,         ,    )  <--punct   --  (sequel    NN   )\n",
      "(ran       VBD  )  <--ROOT    --  (ran       VBD  )\n",
      "(from      IN   )  <--prep    --  (ran       VBD  )\n",
      "(1986      CD   )  <--pobj    --  (from      IN   )\n",
      "(to        IN   )  <--prep    --  (from      IN   )\n",
      "(1988      CD   )  <--pobj    --  (to        IN   )\n",
      "(.         .    )  <--punct   --  (ran       VBD  )\n"
     ]
    }
   ],
   "source": [
    "for token in newdoc:\n",
    "    print('({0:<10}{1:<5})  <--{2:<8}--  ({3:<10}{4:<5})'.format(\n",
    "        token.text,                        # 句子文本 \n",
    "        token.tag_,                        # 标记\n",
    "        token.dep_,                        # 依赖\n",
    "        token.head.text,                   # head的文本\n",
    "        token.head.tag_                    # head的标记\n",
    "    ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.2 可视化依赖关系"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 注意！！！\n",
    "修改D:\\ProgramData\\Anaconda3\\Lib\\site-packages\\spacy的util.py文件，将486行中`return msgpack.dumps(serialized, use_bin_type=True, encoding='utf8')`的encoding='utf8'去掉\n",
    "\n",
    "否则会出现[TypeError: __init__() got an unexpected keyword argument 'encoding'](https://github.com/explosion/spaCy/issues/2868)错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"0\" class=\"displacy\" width=\"950\" height=\"317.0\" style=\"max-width: none; height: 317.0px; color: #000000; background: #ffffff; font-family: Arial\">\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"50\">The</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"50\">DET</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"140\">sequel,</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"140\">NOUN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"230\">Yes,</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"230\">INTJ</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"320\">Prime</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"320\">PROPN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"410\">Minister,</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"410\">PROPN</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"500\">ran</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"500\">VERB</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"590\">from</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"590\">ADP</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"680\">1986</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"680\">NUM</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"770\">to</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"770\">ADP</tspan>\n",
       "</text>\n",
       "\n",
       "<text class=\"displacy-token\" fill=\"currentColor\" text-anchor=\"middle\" y=\"227.0\">\n",
       "    <tspan class=\"displacy-word\" fill=\"currentColor\" x=\"860\">1988.</tspan>\n",
       "    <tspan class=\"displacy-tag\" dy=\"2em\" fill=\"currentColor\" x=\"860\">NUM</tspan>\n",
       "</text>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-0\" stroke-width=\"2px\" d=\"M70,182.0 C70,137.0 125.0,137.0 125.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-0\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">det</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M70,184.0 L62,172.0 78,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-1\" stroke-width=\"2px\" d=\"M160,182.0 C160,2.0 500.0,2.0 500.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-1\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">nsubj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M160,184.0 L152,172.0 168,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-2\" stroke-width=\"2px\" d=\"M160,182.0 C160,137.0 215.0,137.0 215.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-2\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">intj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M215.0,184.0 L223.0,172.0 207.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-3\" stroke-width=\"2px\" d=\"M340,182.0 C340,137.0 395.0,137.0 395.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-3\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">compound</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M340,184.0 L332,172.0 348,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-4\" stroke-width=\"2px\" d=\"M160,182.0 C160,47.0 405.0,47.0 405.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-4\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">appos</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M405.0,184.0 L413.0,172.0 397.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-5\" stroke-width=\"2px\" d=\"M520,182.0 C520,137.0 575.0,137.0 575.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-5\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">prep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M575.0,184.0 L583.0,172.0 567.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-6\" stroke-width=\"2px\" d=\"M610,182.0 C610,137.0 665.0,137.0 665.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-6\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">pobj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M665.0,184.0 L673.0,172.0 657.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-7\" stroke-width=\"2px\" d=\"M610,182.0 C610,92.0 760.0,92.0 760.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-7\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">prep</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M760.0,184.0 L768.0,172.0 752.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "\n",
       "<g class=\"displacy-arrow\">\n",
       "    <path class=\"displacy-arc\" id=\"arrow-0-8\" stroke-width=\"2px\" d=\"M790,182.0 C790,137.0 845.0,137.0 845.0,182.0\" fill=\"none\" stroke=\"currentColor\"/>\n",
       "    <text dy=\"1.25em\" style=\"font-size: 0.8em; letter-spacing: 1px\">\n",
       "        <textPath xlink:href=\"#arrow-0-8\" class=\"displacy-label\" startOffset=\"50%\" fill=\"currentColor\" text-anchor=\"middle\">pobj</textPath>\n",
       "    </text>\n",
       "    <path class=\"displacy-arrowhead\" d=\"M845.0,184.0 L853.0,172.0 837.0,172.0\" fill=\"currentColor\"/>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "newdoc = nlp(list(doc.sents)[0].text)\n",
    "displacy.render(newdoc, style='dep', jupyter=True, options={'distance': 90})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. 词嵌入分析语义\n",
    "需导入的模型快捷方式在`D:\\ProgramData\\Anaconda3\\Lib\\site-packages\\spacy\\data`路径下，模型存在`C:\\Users\\David\\AppData\\Local\\pip\\cache\\wheels`路径下\n",
    "\n",
    "安装方法参考：[spaCy下载模型en_core_web失败：Read timed out](https://blog.csdn.net/wmq104/article/details/82766318)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "nlp = spacy.load('en_core_web_lg')               # 导入word2vec模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.32239 ,  0.38982 ,  0.64522 ,  0.087596,  0.40262 , -0.41253 ,\n",
       "        0.13804 , -0.40226 , -0.30679 ,  3.652   , -0.61745 , -0.24114 ,\n",
       "        0.17488 , -0.25995 , -0.38512 , -0.13747 , -0.37446 , -0.80867 ,\n",
       "        0.28081 ,  0.29735 ], dtype=float32)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word_vector = nlp.vocab['minister'].vector       # 进行词嵌入 维度：(300,)\n",
    "word_vector[:20]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 6.1 比较词语相似性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.dog vs cat: 0.80168545\n",
      "2.dog vs apple: 0.2633902\n",
      "3.apple vs orange: 0.5618917\n"
     ]
    }
   ],
   "source": [
    "dog = nlp.vocab['dog']\n",
    "cat = nlp.vocab['cat']\n",
    "apple = nlp.vocab['apple']\n",
    "orange = nlp.vocab['orange']\n",
    "print('1.dog vs cat:', dog.similarity(cat))     # 比较词语间的相似性，但similarity只计算词典中向量\n",
    "print('2.dog vs apple:', dog.similarity(apple))\n",
    "print('3.apple vs orange:', apple.similarity(orange))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.cosine similarity: 0.8016855120658875\n",
      "2.spacy similarity: 0.80168545\n"
     ]
    }
   ],
   "source": [
    "from scipy.spatial.distance import cosine               # 使用余弦函数计算相似度\n",
    "similarity = 1- cosine(dog.vector, cat.vector)\n",
    "print('1.cosine similarity:', similarity)                      # 两种方法得到的结果差不多\n",
    "print('2.spacy similarity:', dog.similarity(cat))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 6.2 词语向量间的运算\n",
    "例子：guess_word = king -queen + woman"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def vector_similarity(x, y):                      # 计算余弦相似性\n",
    "    return 1 - cosine(x,y)\n",
    "def make_guess_word(words):                       # 获取运算后的词向量\n",
    "    [first, second, third] = words\n",
    "    return nlp.vocab[first].vector - nlp.vocab[second].vector + nlp.vocab[third].vector\n",
    "def get_similar_word(words, scope=nlp.vocab):     #  搜索相似词语\n",
    "    guess_word = make_guess_word(words)\n",
    "    \n",
    "    similarities = []\n",
    "    for word in scope:                            # 在全局范围内找相似向量\n",
    "        if not word.has_vector:                   # 该单词有词向量\n",
    "            continue\n",
    "        similarity = vector_similarity(guess_word, word.vector)\n",
    "        similarities.append((word, similarity))\n",
    "    similarities = sorted(similarities, key=lambda x:x[1], reverse=True)   # 从大到小排序\n",
    "    print([word[0].text for word in similarities[:10]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['MAN', 'Man', 'mAn', 'MAn', 'MaN', 'man', 'mAN', 'WOMAN', 'womAn', 'WOman']\n",
      "Wall time: 30.2 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "words = ['king', 'queen', 'woman']\n",
    "get_similar_word(words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['PAIRS', 'pairs', 'Pairs', 'pair', 'PAIR', 'Pair', 'paired', 'PAIRED', 'Paired', 'IDENTICAL']\n",
      "Wall time: 30.7 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "words = ['Pairs', 'London', 'England']\n",
    "get_similar_word(words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1344233"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(nlp.vocab)                                # 字典大小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 6.3 词嵌入可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['The', 'sequel', 'Yes', 'Prime', 'Minister', 'ran', 'from', '1986', 'to', '1988', 'In', 'total', 'there', 'were', '38', 'episodes', 'of', 'which', 'all', 'but', 'one', 'lasted', 'half', 'an', 'hour', 'Almost', 'ended', 'with', 'a', 'variation', 'the', 'title', 'series', 'spoken', 'as', 'answer', 'question', 'posed', 'by', 'same', 'character', 'Jim', 'Hacker', 'Several', 'adapted', 'for', 'BBC', 'Radio', 'and', 'stage', 'play', 'was', 'produced', 'in', '2010', 'latter', 'leading', 'new', 'television', 'on', 'UKTV', 'Gold', '2013'] 63\n"
     ]
    }
   ],
   "source": [
    "word_list = []                    # 需要演示的列表\n",
    "for token in doc:                 # 开头的text文本\n",
    "    # 当token不是标点且没有在词汇表中才进行添加\n",
    "    if not(token.is_punct) and not(token.text in word_list):\n",
    "        word_list.append(token.text)\n",
    "print(word_list, len(word_list))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.27204001 -0.06203    -0.1884     ...  0.13015001 -0.18317001\n",
      "   0.1323    ]\n",
      " [ 0.14253999 -0.45322999 -0.27893999 ... -0.24725001 -0.45203999\n",
      "   0.17431   ]\n",
      " [-0.13747001  0.19227999 -0.53451997 ... -0.039257   -0.13017\n",
      "  -0.14871   ]\n",
      " ...\n",
      " [ 0.68823999 -0.29369     0.14425001 ... -0.44117001 -0.22014999\n",
      "  -0.29587001]\n",
      " [-0.19140001 -0.071784    0.49133    ... -0.58276999 -0.051528\n",
      "   0.59271002]\n",
      " [ 0.35486001  0.15902001  0.77482998 ... -0.18777999  0.20765001\n",
      "   0.78201002]] (63, 300)\n"
     ]
    }
   ],
   "source": [
    "# 将每个词汇对应的嵌入向量保存到嵌入矩阵中\n",
    "embedding = np.zeros([len(word_list), 300])          # 先创建空矩阵 (63,300)\n",
    "for i, word in enumerate(word_list):\n",
    "#     embedding[i] = np.append(embedding, nlp.vocab[word].vector)\n",
    "    embedding[i] = nlp.vocab[word].vector            # (300,)\n",
    "print(embedding, embedding.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "import matplotlib.pyplot as plt\n",
    "tsne = TSNE()               # 将高维向量压缩为2维向量，可以在平面上绘图\n",
    "low_dim_embedding = tsne.fit_transform(embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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pjzPzi+3UP+4Jpx99XW0PbtbtMuSJEmq8gwaJElRE63VDB/+621m//l/2P/NXgB2btnM7D//D4BhgyRJ0lHyMEhJUo3zrynPl4YMB+3/Zi//mvJ8lCqSJEmqPgwaJEk1zs4vtxxRu1QVxMbGkpKSQocOHUhLS+Pdd98FoLCwkISEhNL3zjrrLFauXFl63cKFCznnnHNo3bo1bdq04aabbuLrr7+O1jQkSdWAQYMkqcapf1yTI2qXqoKEhATy8vL44IMP+O///m+GDx9e+l6rVq1K3xs4cCCPPPIIABs3bqRv3748+uijrFy5kg8//JALLriAnTt3RmsakqRqwKBBklTjnH31ddQ6Jr5MW61j4jn76uuiVJEUrh07dtCoUaOffO+pp55i4MCBpY9+jUQi9OnThxNOOKHCapUkVT8eBilJqnEOHvjoUydUnezZs4eUlBSKiopYv349//znP0vf++STT0hJSWHnzp18/fXXvP/++wDk5+czcODAaJUsSaqmDBokSTVS27O7GSyoWjm4dQJgwYIFXHfddeTn5wP/3joBMHXqVG6++WZmzZoVtVolSdWbWyckSZKqmczMTLZs2cLmzZt/8F52djZz584FoF27duTm5lZ0eZKkas6gQZIkqZopKCiguLiY44477gfvzZs3j1atWgFw++23M2nSpNKtFAAvvPACGzZsqLBaJUnVj1snJEmSqoGDZzQABEHApEmTiI2NBf59RkMQBBxzzDH89a9/BeCEE05gypQpDB06lE2bNhETE8M555zDFVdcEbV5SJKqvkgQBNGuoVR6enqQk5MT7TIkSZIkSdL3RCKR3CAI0n+qnysaJEmSaqjdSzax481CirftJfbYeBpktaBuatNolyVJquIMGiRJkmqg3Us2se3VVQT7SgAo3raXba+uAjBskCQdFQ+DlCRJqoF2vFlYGjIcFOwrYcebhdEpSJJUbRg0SJIk1UDF2/YeUbskST+XQYMkSVINFHts/BG1S5L0cxk0SJIk1UANsloQiSv7X8FIXAwNslpEpyBJUrXhYZCSJEk10MEDH33qhCQpbEcdNEQikdbA1O80tQTuB44F/gvY/G3774IgeP1o7ydJkqRw1E1tarAgSQrdUQcNQRCsBFIAIpFILLAWeA24HvhTEARjj/YekiRJkiSpagj7jIbuwCdBEHwW8riSJEmSJKkK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QJmVMJ9++iljx45l0aJFNGrUiEGDBlFUVPSj9zpUTa+88gqtW7cu0/7++++74kaSJEmqYQwaQnJwpcFBgwYNYtCgQQD06tWLXr16/eCaevXqlVnh8P2xjjnmGN58883S9iFDhjBkyJAf9M/Pzz+a0lXFdO/encsvv5y77rqL4447jq1bt/5o3+3bt9O0aVPi4uJ4++23+eyzzw7Zb8eOHdStW5eGDRuyceNG3njjDbp27UqbNm1Yt24dixYtIiMjg507d5KQkED9+vXZuXNn6fVZWVk8+eSTPPnkk0QiEZYsWUJqamroc5ckSZJU+RnPN0p9AAAgAElEQVQ0VEEzV89k3OJxbNi9gWZ1mzEkbQgXt7w42mWpgrRr144RI0Zw7rnnEhsbe9gf6Pv378+ll15Keno6KSkptGnT5pD9OnToQGpqKu3ataNly5Z07twZOBB2TZ06lTvuuIM9e/aQkJDAnDlz6NatW+lWieHDh3Pfffdx5513kpycTBAEtGjRgn/84x/lMn9JkiRJlVvk4BLryiA9PT3IycmJdhmV2szVMxn17iiKiotK22rH1mbUWaMMGyRJkiRJ5SYSieQGQZD+U/08DLKKGbd4XJmQAaCouIhxi8dFqSKprOlL1tJ59D859d6ZdB79T6YvWRvtkiRJkiRVILdOVDEbdm84onapIk1fspbhry5jz75iANZu28PwV5cBcFnqidEsTZIkSVIFcUVDFdOsbrMjapcq0pg3V5aGDAft2VfMmDdXRqkiSZIkSRXNoKGKGZI2hNqxtcu01Y6tzZC0Hz6NQqpo67btOaJ2SVLl9MQTT/D1119HuwxJUhVl0FDFXNzyYkadNYrEuolEiJBYN9GDIFVpND824YjaJUmVk0GDJOloeEZDFXRxy4sNFlQpDctqXeaMBoCEuFiGZbWOYlWSpMPZvXs3V155JV988QXFxcX07duXdevW0a1bN5o0acLbb7/N4MGDWbRoEXv27KFPnz488MADALz++uvcfffdNGnShLS0NFavXs0//vEPdu/ezR133MGyZcvYv38/o0aNolevXlGeqSSpohg0SArNwQMfx7y5knXb9tD82ASGZbX2IEhJqsRmzZpF8+bNmTlzJgDbt2/nueee4+2336ZJkyYAPPzwwzRu3Jji4mK6d+/O0qVLOe2007jllluYO3cup556Kv369Ssd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995bYzw1NVVbtmxRenq62rRpoyFDhqisrEySZBjGZb23p+e57Sru7u6qrKx0fh4AXA7OaAAAoImZ091Xrd1q/mOhtZuhOd19LUoEwArx8fFaunSp8w4UR44c0bfffquioiJ17NhRbdq0UW5urj799FNJUr9+/ZSamqqTJ0+qoqJC7777bq0+b9CgQXrnnXckSfv27dPevXvr9oIAuAxWNAAA0MScP4eBu04AzVtcXJz279+vAQMGSDp328u33npLw4YNU3Jysmw2m3r16qX+/ftLknx9fZWYmKgBAwbI19dXERERqqqquuzPmz59uu666y7ZbDaFh4fLZrPJy8urXq4NQNNmNKYlUFFRUSYn1wIAAACNT1VVlSoqKtSqVSvl5eUpNjZWX375pVq2bGl1NAANxDCMDNM0oy41jxUNAAAAAH7W6d3f6ug/cjQm+T5VqUpGOw+98sorlAwALoiiAagF0zRlmqbc3DjeBK7L4XBo+PDhys7Ovqz5qampatmypW688cZ6TgYAsMLp3d+q8L2Dal3RQh/c9aqkc7cd9e5yvcXJADRW/GsJuASHw6HAwEBNnz5dERER+u///m9FluCEkQAAIABJREFURUUpKChI8+bNc87z9/fXvHnzFBERoZCQEOXm5lqYGmg4qamp2rlzp9UxAAD15PuPHDIrqmuMmRXV+v4jhzWBADR6FA3AZThw4IAmT56s3bt3629/+5vsdruysrL0ySefKCsryznPx8dHX3zxhe677z4lJSVZmBi4MpWVlc4Dv8aOHaszZ87I399fJ06ckCTZ7XYNGTJEDodDycnJmj9/vsLCwpSWlmZxcgBAXasqLK/VOABQNACX4brrrnOe2PzOO+8oIiJC4eHhysnJ0b59+5zzRo8eLUmKjIyUw+GwIipQJw4cOKCpU6cqKytLHTp00OLFiy84z9/fX9OmTdOsWbOUmZmp6OjoBk4KAKhv7t6etRoHAIoG4DK0bdtWkvTVV18pKSlJKSkpysrK0m233aaysjLnPE/Pc99w3d3dVVlZaUlWoC5ce+21GjhwoCRp0qRJ2r59u8WJAABW6RDvL8Oj5j8bDA83dYj3tyYQgEaPogGohe+//15t27aVl5eXvvnmG3344YdWRwLqhWEYP3neokULVVef26P7w4INAODa2oZfLe/R1ztXMLh7e8p79PVqG361xckA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RUVFSkpKclFHAACguiBoqGESExN18uRJWa1W2Ww2NWvWTAUFBWrXrp2sVqsCAwM1duxYTZo06Rf3mqapHj16yGazyWazadeuXXr//fcl6bJ2LQcA1BzZ2dlXVAeA6mTBggUaPXr0Vd1rt9v10UcfXfF9I0aM0NKlS6/qM4HqhqChhsnOzpavr688PDyUnJysQ4cOSZKOHTum+vXr6+GHH1Z8fLy2bdsmSbruuuuUk5MjSYqMjNSGDRv07bffSpLOnTunffv2yd/fXwcPHtT+/fslSR9//LELRgYAqEwXm/n2W3UAqC2uNmgAahOChhpm6NChSktLU3h4uBITE+Xv7y9J2rFjhzp16qTg4GC9/PLLeumllyRJjz32mH73u9+pW7duatq0qRYsWKAhQ4bIYrEoMjJSe/bskZeXl+bOnas+ffrozjvvVJs2bVw5RABAJYiLi5OHh0e5moeHh+Li4lzUEQBcvvvuu09hYWHq2LGj5s6dK0maP3++2rVrpy5dumjDhg2Oa1etWqXOnTsrJCREd911l44fPy5JmjBhgh555BF1795dt912m2Ovs+eff16pqakKDg7W9OnTVVJSooSEBEVERMhisWjOnDmSymYLjx49Wrfffrv69OmjEydOVPJ3AXAdNoMEAAAXxakTAKqr06dPq0mTJsrPz1dERIS+/PJLRUVFyWq1ysfHR926dVNISIjeeust/fjjj2rUqJEMw9B7772n3bt36/XXX9eECRO0YsUKbd68WXl5eQoJCdHXX3+tffv2lTvqfe7cuTpx4oReeuklFRYWKjo6WkuWLNH27ds1a9YsffHFFzp+/Lhuv/12vffeexowYICLvzvA1eN4SzhPxidS0iQp+4jk00qKGy9ZHnR1VwCACmaxWAgWAFRLM2bM0IoVKyRJhw8f1gcffKCuXbuqadOmkqRBgwZp3759kqQjR45o0KBBysrK0k8//aS2bds6nnPvvfeqXr16qlevnrp166YtW7aoUaNG5T5r9erVysjIcOy/kJ2drczMTK1bt05DhgyRm5ubWrZsqe7du1fG0IEqgaUT+G0Zn0irnpayD0syy35f9XRZHQAAAKhiUlJStGbNGm3atEnp6ekKCQmRv7//r25u/qc//UmjR4/Wjh07NGfOHBUUFDje++97LvYM0zQ1c+ZMx4bqBw8eVM+ePX/1eqA2IGjA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AACmkC0GDa21457teFVNT3Jqkldu8pgnkjzRba+sqruTHJxkxWauf2mSS5Nk3rx57bl0HgAAAJha+pg6cVySb7fW7t/QUFV7VtUO3fasJAcluaeH5wIAAACmsD4WgzwtvzhtIklek+Qvqmp9kp8leUdr7eEengsAAACYwiYdNLTWzthM2zVJrpnstQEAAIDR0tenTgAAAAAIGgAAAID+CBoAAACA3ggaAAAAgN4IGgAAAIDeCBoAAACA3ggaAAAAgN4IGgAAAIDeCBoAAACA3ggaAAAAgN4IGgAAAIDeCBoAAACA3ggaAIBJq6q8+c1v3ri/fv367LnnnjnxxBOTJMuWLcvixYuf9RoPPvhg3vCGNzzj8UceeSSXXHJJPx0GALYZQQMAMGm77rprbrvttvzkJz9Jktxwww3Zd999Nx5fuHBhzj///Ge9xkte8pJcffXVz3h8a4KG1lqeeuqp5/QYAGByBA0AQC+OP/74XH/99UmSpUuX5vTTT9947FOf+lTe8573JEnOOOOMnHXWWXnVq16VWbNmbQwX7r333syePTtJcvvtt+eoo47K3LlzM2fOnKxevTrnn39+7r777sydOzfve9/7kiRLlizJkUcemTlz5uRDH/rQxusceuihede73pUjjjgi991336/sewAACBoAgJ6cdtppufLKK/P444/n1ltvzdFHH/2M565ZsyZf+9rX8oUvfGGzdzp8/OMfz9lnn52JiYmsWLEiM2fOzOLFi3PggQdmYmIiS5YsyfLly7N69erccsstmZiYyMqVK/PVr341SXLnnXfmLW95S1atWpX9999/m33NAMDTTR92BwCA8TBnzpzce++9Wbp0aU444YRnPfeUU07JtGnTcthhh+Whhx562vH58+fnwx/+cO6///6ceuqpOeigg552zvLly7N8+fK84hWvSJKsW7cuq1evzn777Zf9998/xxxzTD9fGADwnLijAQDozcKFC3Peeef9wrSJzZkxY8bG7dba046/6U1vyrJly7LLLrtkwYIFufHGG592TmstF1xwQSYmJjIxMZG77rorZ555ZpLBmhEAwHAIGgCA3rztbW/LokWLcvjhh0/qOvfcc09mzZqVs846KwsXLsytt96a5z//+Xnsscc2nrNgwYJcdtllWbduXZLkgQceyNq1ayf1vADA5Jk6AQD0ZubMmTn77LMn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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1748a523cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_wordvec(low_dim_embed, labels, filename='tsne.pdf'):\n",
    "    assert low_dim_embed.shape[0] == len(labels), 'labels and samples do not match'\n",
    "    plt.figure(figsize=(18,18))\n",
    "    for i, label in enumerate(labels):\n",
    "        x, y = low_dim_embed[i,:]\n",
    "#         plt.xlim(-200,200)                           # 限定坐标显示范围\n",
    "#         plt.ylim(-200,200)\n",
    "        plt.scatter(x,y)                               # 画散点图\n",
    "        plt.annotate(label, xy=(x,y), xytext=(5,2), textcoords='offset points', \n",
    "                    ha='right', va='bottom')           # 标注\n",
    "    plt.show()\n",
    "#     plt.savefig(filename)\n",
    "plot_wordvec(low_dim_embedding, word_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
